package com.example.demo.controller;

import com.example.demo.common.*;
import com.example.demo.entity.ArticleInfo;
import com.example.demo.entity.UserInfo;
import com.example.demo.entity.VO.ArticleInfoVO;
import com.example.demo.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-06-06
 * Time: 17:20
 */
@RestController
@RequestMapping("/article")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    /**
     * 写文章功能
     *
     * @param articleInfo 文章对象
     */
    @RequestMapping("/add")
    @Transactional
    public AjaxResult add(ArticleInfo articleInfo, HttpServletRequest request) {

        // 1. 非空效验
        if (articleInfo == null || !StringUtils.hasLength(articleInfo.getTitle()))
            return AjaxResult.fail(-1, "标题不能为空!");

        if (!StringUtils.hasLength(articleInfo.getContent()))
            return AjaxResult.fail(-1, "正文不能为空!");

        // 2. 得到当前登录用户的 id 设置其发布文章的 uid
        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "请先登录");

        // 用户表中的 id 关联文章表中的 uid, 表明改文章是谁发布的
        articleInfo.setUid(userInfo.getId());

        // 3. 持久化
        int result = articleService.addArticle(articleInfo);

        return AjaxResult.success(result); // 添加操作一次一条 返回 1 为添加成功
    }

    /**
     * 修改文章时,初始化修改文章页面内容
     *
     * @param id 前端传入的文章 id
     */
    @RequestMapping("/initArticle")
    public AjaxResult initArticle(Integer id, HttpServletRequest request) {

        // 1. 非空校验
        if (id == null || id <= 0) return AjaxResult.fail(-1, "参数异常");

        // 2. 获取 uid
        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "请先登录");

        // 3. 根据 id 查询用户并根据 uid 校验归属人
        ArticleInfo articleInfo = articleService.getArticleByIdAndUid(id, userInfo.getId());

        return AjaxResult.success(articleInfo);
    }

    /**
     * 修改文章并发布功能
     */
    @RequestMapping("/update")
    @Transactional
    public AjaxResult updateArticle(ArticleInfo articleInfo, HttpServletRequest request) {

        // 1. 数据检验
        if (articleInfo.getId() <= 0
                || !StringUtils.hasLength(articleInfo.getTitle())
                || !StringUtils.hasLength(articleInfo.getContent())
                || !StringUtils.hasLength(articleInfo.getDescription()))
            return AjaxResult.fail(-1, "参数有误");

        // 2. 获取用户当前登录用户的 id
        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null)
            return AjaxResult.fail(-1, "参数异常!");

        // 3. 修改文章
        // 3.1 设置文章的 uid 为 当前获取到的用户 id 进行关联, 前端传入的是文章的自增 id
        articleInfo.setUid(userInfo.getId());
        // 3.2 更新修改时间
        articleInfo.setUpdatetime(LocalDateTime.now());
        articleInfo.setState(1);
        int result = articleService.updateArticle(articleInfo);

        return AjaxResult.success(result);
    }

    /**
     * 获取文章详细内容
     *
     * @param id 前端传入的文章自增 id
     */
    @RequestMapping("/getdetial")
    public AjaxResult getDetailArticle(Integer id) {

        if (id == null || id <= 0) return AjaxResult.fail(-1, "参数异常");

        ArticleInfoVO articleInfoVO = articleService.getDetailArticle(id);

        return AjaxResult.success(articleInfoVO);
    }

    /**
     * 实现文章的阅读量统计更新
     *
     * @param id 前端传入的文章自增 id
     */
    @RequestMapping("/addvisits")
    @Transactional
    public AjaxResult addvisits(Integer id) {

        if (id == null || id <= 0) return AjaxResult.fail(-1, "参数异常!");

        articleService.addvisits(id);

        return AjaxResult.success("");
    }

    /**
     * 查询指定用户的所有文章数目, 并更新到用户文章数中
     *
     * @param id 前端传入的文章自增 id
     */
    @RequestMapping("/countart")
    public AjaxResult countArticle(Integer id) {

        // 1. 根据文章的自增 id 确认文章
        ArticleInfo articleInfo = articleService.selectArticleById(id);

        // 2. 获取此文章 uid
        int uid = articleInfo.getUid();

        // 3. 通过 uid 查询作者的所有文章
        List<ArticleInfo> list = articleService.countArticle(uid);

        return AjaxResult.success(list.size());
    }

    /**
     * 查询当前用户的所有已发布的文章并返回
     */
    @RequestMapping("getAllArticle")
    public AjaxResult getAllArticle(HttpServletRequest request) {
        // 1. 获取当前用户 id
        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "参数异常!");

        // 2. 传入当前用户 id 关联 uid
        int uid = userInfo.getId();
        List<ArticleInfo> list = articleService.getAllArticle(uid);

        // 3. 截取摘要
        for (ArticleInfo item : list) {
            // 3.1 去除关键字
            String removeKeyWords = RemoveKeyWords.removeKeywords(item.getContent());
            // 3.2 截取文章
            item.setContent(AbstractContentTools.SubContent(removeKeyWords, ApplicationVariable.maxLength));
        }

        return AjaxResult.success(list);
    }

    /**
     * 删除指定 id 的文章
     *
     * @param id 前端传入的当前文章的自增 id
     */
    @RequestMapping("del")
    @Transactional
    public AjaxResult del(Integer id, HttpServletRequest request) {

        if (id == null || id <= 0) return AjaxResult.fail(-1, "参数异常!");

        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "参数异常");

        int result = articleService.del(id, userInfo.getId());

        return AjaxResult.success(result);
    }

    /**
     * 获取每一页中所有用户已发表的文章
     * @param pageSize  前端传来当前分页器每页的最大文章数
     * @param pageIndex 前端传入的当前位于分页器的第几页
     */
    @RequestMapping("/getAllArticleByPage")
    public AjaxResult getAllArticleByPage(Integer pageSize, Integer pageIndex) {
        // 首次加载在首页, 没有传入 pageSize
        if (pageSize == null || pageSize <= 0) {
            pageSize = 2; // 设置默认的 pageSize
        }

        if (pageIndex == null || pageIndex <= 0) {
            pageIndex = 1; // 首次访问没有传入参数, 默认为第一页
        }

        int offset = (pageIndex - 1) * pageSize; // 分页公式

        List<ArticleInfo> list = articleService.getAllArticleByPage(pageSize, offset, 1);

        // 文章摘要处理
        for (ArticleInfo item : list) {
            // 3.1 去除关键字
            String removeKeyWords = RemoveKeyWords.removeKeywords(item.getContent());
            // 3.2 截取文章
            item.setContent(AbstractContentTools.SubContent(removeKeyWords, ApplicationVariable.maxLength));
        }
        return AjaxResult.success(list);
    }

    /**
     * 不同页中加载当前用户已发布的不同文章
     */
    @RequestMapping("/getAllArticleByPageFromUser")
    public AjaxResult getAllArticleByPageFromUser(Integer pageSize, Integer pageIndex, HttpServletRequest request) {

        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "参数异常");

        // 首次加载在首页, 没有传入 pageSize
        if (pageSize == null || pageSize <= 0) {
            pageSize = 2; // 设置默认的 pageSize
        }

        if (pageIndex == null || pageIndex <= 0) {
            pageIndex = 1; // 首次访问没有传入参数, 默认为第一页
        }

        int offset = (pageIndex - 1) * pageSize; // 分页公式

        List<ArticleInfo> list = articleService.getAllArticleByPageFromUser(pageSize, offset, userInfo.getId(), 1);

        // 文章摘要处理
        for (ArticleInfo item : list) {
            // 3.1 去除关键字
            String removeKeyWords = RemoveKeyWords.removeKeywords(item.getContent());
            // 3.2 截取文章
            item.setContent(AbstractContentTools.SubContent(removeKeyWords, ApplicationVariable.maxLength));
            System.out.println("文章摘要 : " + item.getDescription());
        }
        return AjaxResult.success(list);
    }

    /**
     * 聚合查询当前用户已发表的文章数 - 根据 uid
     */
    @RequestMapping("/getArticleFromUser")
    public AjaxResult getArticleFromUser(HttpServletRequest request) {
        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "参数异常");
        int result = articleService.getArticleFromUser(userInfo.getId(), 1);
        return AjaxResult.success(result);
    }

    /**
     * 聚合查询所有人已发表的文章数
     */
    @RequestMapping("/allarticle")
    public AjaxResult getArticle() {
        int result = articleService.getArticle(1);
        return AjaxResult.success(result);
    }

    /**
     * 查询当前用户并设置其信息栏头像
     *
     * @param id 当前文章 id
     */
    @RequestMapping("/initimage")
    public AjaxResult initimage(Integer id) {
        // 1. 数据效验
        if (id == null || id <= 0) return AjaxResult.fail(-1, "参数异常");

        // 2. 多表联查, 根据文章自增 id  确认文章归属人
        ArticleInfoVO articleInfoVO = articleService.getImagePath(id);

        return AjaxResult.success(articleInfoVO);
    }

    /**
     * 保存草稿功能
     */
    @RequestMapping("/savearticle")
    @Transactional
    public AjaxResult saveArticle(ArticleInfo articleInfo, HttpServletRequest request) {

        // 1. 数据效验
        // 只需效验正文是否有内容
        if (!StringUtils.hasLength(articleInfo.getContent())) {
            return AjaxResult.fail(-1, "正文无内容");
        }

        // 2. 得到当前登录用户的 id 设置其发布文章的 uid
        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "请先登录");

        // 用户表中的 id 关联文章表中的 uid, 表明改文章是谁发布的
        articleInfo.setUid(userInfo.getId());

        // 设置状态为未发布状态
        articleInfo.setState(2);

        // 保存文章
        int result = articleService.saveArticle(articleInfo);
        return AjaxResult.success(result);
    }


    /**
     * 查询当前用户未发布的所有文章
     *
     * @param pageSize  一页最大几条记录
     * @param pageIndex 当前位于第几页
     * @return
     */
    @RequestMapping("/getAllArticleByPageNotSub")
    public AjaxResult getAllArticleByPageNotSub(Integer pageSize, Integer pageIndex, HttpServletRequest request) {

        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "参数异常");

        // 首次加载在首页, 没有传入 pageSize
        if (pageSize == null || pageSize <= 0) {
            pageSize = 2; // 设置默认的 pageSize
        }

        if (pageIndex == null || pageIndex <= 0) {
            pageIndex = 1; // 首次访问没有传入参数, 默认为第一页
        }

        int offset = (pageIndex - 1) * pageSize; // 分页公式

        List<ArticleInfo> list = articleService.getAllArticleByPageFromUser(pageSize, offset, userInfo.getId(), 2);

        // 文章摘要处理
        for (ArticleInfo item : list) {
            // 3.1 去除关键字
            String removeKeyWords = RemoveKeyWords.removeKeywords(item.getContent());
            // 3.2 截取文章
            item.setContent(AbstractContentTools.SubContent(removeKeyWords, ApplicationVariable.maxLength));
        }
        return AjaxResult.success(list);
    }

    /**
     * 查询当前用户未发布的文章总数
     */
    @RequestMapping("/getArticleNotSub")
    public AjaxResult getArticleNotSub(HttpServletRequest request) {

        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "参数异常");
        int result = articleService.getArticleFromUser(userInfo.getId(), 2);
        return AjaxResult.success(result);

    }

    /**
     * 自动保存功能
     *
     * @param articleInfo 前端传入传入的未发表文章对象
     *                                       TODO: 2023/6/16  artuuid 此时正在编辑这篇文章的 uuid
     */
    @RequestMapping("/autosavearticle")
    @Transactional
    public AjaxResult autoSaveArticle(ArticleInfo articleInfo, HttpServletRequest request) {
//        if(!StringUtils.hasLength(articleInfo.getTitle()) || !StringUtils.hasLength(articleInfo.getDescription()) ||
//            !StringUtils.hasLength(articleInfo.getContent()) || !StringUtils.hasLength(articleInfo.getArtuuid())) {
//            return AjaxResult.fail(-1, "状态异常, 无法保存");
//        }

        // 2. 得到当前登录用户的 id 设置其发布文章的 uid
        UserInfo userInfo = GetUserSessionTools.getLoginUser(request);
        if (userInfo == null) return AjaxResult.fail(-1, "请先登录");

        // 用户表中的 id 关联文章表中的 uid, 表明改文章是谁发布的
        articleInfo.setUid(userInfo.getId());

        // 设置文章的状态码为未发布状态
        articleInfo.setState(2);
        int result = articleService.autoSaveArticle(articleInfo);
        return AjaxResult.success(result);
    }
}
